16. 图片分类 CNN
CNN19 图片分类 CNN
和神经网络一样,我们通过首先创建一个
序列
模型来创建一个 CNN。
from keras.models import Sequential
导入几个层,包括熟悉的神经网络层,以及在这节课学习的新的层。
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
和神经网络一样,通过使用
.add()
方法向网络中添加层级:
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, padding='same', activation='relu', input_shape=(32, 32, 3)))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Flatten())
model.add(Dense(500, activation='relu'))
model.add(Dense(10, activation='softmax'))
该网络以三个卷积层(后面跟着最大池化层)序列开始。前 6 个层级旨在将图片像素数组输入转换为所有空间信息都丢失、仅保留图片内容信息的数组 。然后在 CNN 的第七个层级将该数组扁平化为向量。后面跟着两个密集层,旨在进一步说明图片中的内容。最后一层针对数据集中的每个对象类别都有一个条目,并具有一个 softmax 激活函数,使其返回概率。
注意
:在该视频中,你可能注意到卷积层表示为
Convolution2D
,而不是
Conv2D
。对于 Keras 2.0 来说,二者都可以,但是最好使用
Conv2D
。
注意事项
-
始终向 CNN 中的
Conv2D层添加 ReLU 激活函数。但是网络的最后层级除外,密集层也应该具有 ReLU 激活函数。 -
在构建分类网络时,网络中的最后层级应该是具有 softmax 激活函数的
密集层。最后层级的节点数量应该等于数据集中的类别总数。 - 要开心!如果你觉得有点泄气,建议参阅 Andrej Karpathy 的 tumblr (来自外网,可能打不开),其中包含了用户提交的损失函数,对应的是本身有问题的模型。损失函数在训练期间应该是减小的,但是这些图表显示的却是非常不同的行为 :)。